package ctrl;

import java.util.ArrayList;
import java.util.List;

import db.*;
import model.Model;
import view.Ui;

public class Ctrl {

	private Ui ui;
	private Model model;

	public Ctrl(Ui u, Model m) {
		ui = u;
		model = m;
	}

	public List<Ajankohta> listAjankohta() {
		return model.listAjankohta();
	}

	public List<Lasi> listLasi() {
		return model.listLasi();
	}

	public List<Lämpötila> listLämpötila() {
		return model.listLämpötila();
	}

	public List<Menetelmä> listMenetelmä() {
		return model.listMenetelmä();
	}

	public List<Makeus> listMakeus() {
		return model.listMakeus();
	}

	public List<Drinkki> listDrinkki() {
		return model.listDrinkki();
	}

	public boolean addAinesosa(String nimi) {
		boolean ret = false;
		try {
			if (!nimi.isEmpty()) {
				model.addAinesosa(nimi);
				ret = true;
			}
		} catch (Exception e) {
			// We can assume that this failed.
			e.printStackTrace();
		}
		finally {
			return ret;
		}
	}

	public boolean addLasi(String kuvaus) {
		boolean ret = false;
		try {
			if (!kuvaus.isEmpty()) {
				model.addLasi(kuvaus);
				ret = true;
			}
		} catch (Exception e) {
			// We can assume that this failed.
			e.printStackTrace();
		}
		finally {
			return ret;
		}
	}

	public boolean addDrinkki(String[] nimet, String[] ainesosat,
	                          String aika, String lasi, String lämpötila,
	                          String makeus, String menetelmä, String ohje)
	{
		boolean ret = false;
		try {
			if (aika != null && lasi != null && lämpötila != null &&
			    makeus != null && menetelmä != null &&
			    nimet.length * ainesosat.length * aika.length() *
			    lasi.length() * lämpötila.length() *
			    makeus.length() * menetelmä.length() > 0) {
				model.addOrUpdateDrinkki(
					nimet, ainesosat, aika, lasi,
					lämpötila, makeus, menetelmä, ohje
				);
				ret = true;
			}
		} catch (Exception e) {
			// We can assume that this failed.
			e.printStackTrace();
		}
		finally {
			return ret;
		}
	}

	public boolean addMenetelmä(String kuvaus) {
		boolean ret = false;
		try {
			if (!kuvaus.isEmpty()) {
				model.addMenetelmä(kuvaus);
				ret = true;
			}
		} catch (Exception e) {
			// We can assume that this failed.
			e.printStackTrace();
		}
		finally {
			return ret;
		}
	}

	public boolean removeDrinkki(String kuvaus) {
		boolean ret = false;
		try {
			if (!kuvaus.isEmpty()) {
				model.removeDrinkki(kuvaus);
				ret = true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		finally {
			return ret;
		}
	}

	public List<String> search(String[] nimet, String[] ainesosat,
	                           String aika, String lasi, String lämpötila,
	                           String makeus, String menetelmä) {

		Ajankohta _ajankohta = Ajankohta.search(aika);
		Lasi _lasi           = Lasi.search(lasi);
		Lämpötila _lämpötila = Lämpötila.search(lämpötila);
		Makeus _makeus       = Makeus.search(makeus);
		Menetelmä _menetelmä = Menetelmä.search(menetelmä);

		ainesosat = (ainesosat.length == 1 && ainesosat[0].isEmpty()) ?
			null : ainesosat;
		nimet = (nimet.length == 1 && nimet[0].isEmpty()) ?
			null : nimet;

		List<Ainesosa> _ainesosat = Ainesosa.search(ainesosat);
		List<Nimi> _nimet = Nimi.search(nimet);

		List<Drinkki> drinkit = model.search(
			_nimet, _ainesosat, _ajankohta,
			_lasi, _lämpötila, _makeus, _menetelmä);

		List<String> ls = new ArrayList<String>();

		for (Drinkki d : drinkit) {
			String s = d.getTehNimi() + "\n(";
			for (Nimi n : d.getNimet()) {
				s = s.concat(n.getNimi() + ", ");
			}
			if (s.endsWith(", "))
				s = s.substring(0, s.length()-2);
			s = s.concat(")\n\n" + d.getAinesosat() + "\n\n" +
			             d.getOhje() + "\n\n");
			ls.add(s);
		}

		return ls;
	}

	public String[] getDrinkValues(String nimi) {
		Drinkki d = Nimi.searchExactMatch(nimi).getDrinkki();
		String ret[] = new String[8];

		for (int i = 0; i < 8; ++i)
			ret[i] = new String("");

		List<Nimi> nimet = d.getNimet();
		for (Nimi n : nimet)
			ret[0] = ret[0].concat(n.getNimi()) + ", ";
		ret[0] = ret[0].substring(0, ret[0].length()-2);

		List<Ainesosa> aineet = d.getAinesosat();
		for (Ainesosa a : aineet)
			ret[1] = ret[1].concat(a.getNimi()) + ", ";
		ret[1] = ret[1].substring(0, ret[1].length()-2);

		ret[2] = d.getAjankohta().getKuvaus();
		ret[3] = d.getMakeus().getKuvaus();
		ret[4] = d.getLasi().getKuvaus();
		ret[5] = d.getLämpötila().getKuvaus();
		ret[6] = d.getMenetelmä().getKuvaus();
		ret[7] = d.getOhje();

		return ret;
	}
}
